﻿using CavinatorService.DAO.Base;
using CavinatorService.DAO.Extensao;
using CavinatorService.DAO.Parametros;
using CavinatorService.Model;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CavinatorService.DAO
{
    /// <summary>
    /// Classe responsavel pela manipulacao de dados da pergunta
    /// </summary>
    public class QuestionMapper : BaseMapper<Question>
    {
        #region Properties

        /// <summary>
        /// Nome da tabela
        /// </summary>
        public override string TableName
        {
            get { return "Question"; }
        }

        /// <summary>
        /// Id da tabela
        /// </summary>
        public override string[] Keys
        {
            get { return new string[] { "Id" }; }
        }

        #endregion

        #region Constructors

        public QuestionMapper()
            : base(SParam.Connection)
        {
        }

        #endregion

        #region Methods

        /// <summary>
        /// Atualiza uma pergunta
        /// </summary>
        /// <param name="registro">Dados da pergunta</param>
        public override void Atualizar(Question registro)
        {
            string comando = string.Format(@"UPDATE {0}
                                               SET Value = @VALUE
                                             WHERE Id = @ID", TableName);

            List<IDbDataParameter> lstParam = new List<IDbDataParameter>();
            lstParam.Add(new SqlParameter("@VALUE", registro.Value));
            lstParam.Add(new SqlParameter("@ID", registro.Id));

            base.RetornarAfetadas(CommandType.Text, comando, lstParam);
        }

        /// <summary>
        /// Insere uma pergunta
        /// </summary>
        /// <param name="registro">Dados da pergunta</param>
        public override void Inserir(Question registro)
        {
            string comando = string.Format(@"INSERT INTO {0}
                                                    (Value)
                                                VALUES
                                                    (@VALUE);
                                            SELECT @@IDENTITY;", TableName);

            List<IDbDataParameter> lstParam = new List<IDbDataParameter>();
            lstParam.Add(new SqlParameter("@VALUE", registro.Value));

            registro.Id = Convert.ToInt32(base.RetornarUnicoValor(CommandType.Text, comando, lstParam));
        }

        /// <summary>
        /// Exclui uma pergunta
        /// </summary>
        /// <param name="id">Id da pergunta</param>
        public override void Excluir(int id)
        {
            string comando = string.Format(@"DELETE FROM {0}
                                             WHERE ID = @ID", TableName);

            List<IDbDataParameter> lstParam = new List<IDbDataParameter>();
            lstParam.Add(new SqlParameter("@ID", id));

            base.RetornarAfetadas(CommandType.Text, comando, lstParam);
        }

        /// <summary>
        /// Lista as perguntas
        /// </summary>
        /// <returns>Lista de perguntas</returns>
        public override List<Question> Listar()
        {
            string comando = string.Format(@"SELECT * FROM {0}", TableName);

            return Util.CriarListaObjeto<Question>(base.RetornarReader(CommandType.Text, comando));
        }

        #endregion
    }
}
